#ifndef _JOGOS_H_
#define _JOGOS_H_

#include <string>
#include <iostream>
#include "equipa.h"
#include "pavilhao.h"

//#include "jornadas.h"

using std::string;
using std::ostream;

// Nao e usada agora
// class Jornadas {};

//! Struct Resultado
/*! Suporta o resultado de um jogo */
struct Resultado {
    int equipa1; /*!< Resultado da equipa da casa*/
    int equipa2; /*!< Resultado da equipa de fora */
};

//! Struct Data
/*! Indica o dia e o mes a que um jogo ocorreu (o ano corresponde a epoca do campeonato) */
struct Data {
    int dia; /*!< Dia em qeu o jogo decorreu */
    int mes; /*!< Mes em que o jogo decorreu */
};

//! Classe Jogo
/*! Cada objecto desta class corresponde a um jogo entre duas equipas */
class Jogo {
public:
    //! Construtor
    /*!
      \param loc Local em que o jogo se realizou
      \param referee Nome do arbitro que arbitrou o jogo
      \param day Dia em que o jogo decorreu
      \param month Mes em que o jogo decoreu
      \param eq1 Equipa da casa
      \param eq2 Equipa de fora
    */
    explicit Jogo(string loc, string referee, int day, int month, Equipa* eq1, Equipa* eq2,
        //! Devolve o resultado do jogo
        int resultado_eq1, int resultado_eq2);
    //!Destrutor
    ~Jogo() {};
    //! Devolve o local do jogo
    string getLocal();
    //! Devolve o nome do arbitro que arbitrou o jogo
    string getArbitro();
    //! Devolve o dia
    int getDia();
    //! Devolve o mes
    int getMes();
    //! Devolve um objecto do tipo Data corresponde a data onde ocorreu o jogo
    Data getData();

    //! Devolve um apontador para a equipa da casa
    Equipa* getEquipa1();
    //! Devolve um apontador para a equipa de fora
    Equipa* getEquipa2();

    //! Devolve um objecto do tipo Resultado que contem o resultado do jogo
    Resultado getResultado() {
        return resultado;
    }
    // FIXME: ostream& nao funciona aqui WHY?! (algo me diz que tenho que rever a materia das funcoes friend)
    //ostream& imprimir(ostream& os);
    //! Imprime informacoes relativas ao jogo
    void imprimir();

private:
    //! variavel privada local
    string local;
    //! variavel privada arbitro
    string arbitro;
    //! variavel privada data_jogo do tipo DATA
    Data data_jogo;
    //! Apontador para a equipa da casa
    Equipa* equipa1;
    //! Apontador para a equipa de fora
    Equipa* equipa2;
    //! Variavel resultado do tipo Resultado
    Resultado resultado;
};

//! Excepcao DataInvalida
/*! Ao tentar criar um jogo com uma data invalida esta excepcao e lancada */
class DataInvalida {
public:
    DataInvalida() {}

};

#endif // _JOGOS_H_
